Mã Hamming (7,4) Mã Hamming

Hiện thời, khi nói đến mã Hamming chúng ta thực ra là muốn nói đến mã (7,4) mà Hamming công bố năm 1950. Với mỗi nhóm 4 bit dữ liệu, mã Hamming thêm 3 bit kiểm tra. Thuật toán (7,4) của Hamming có thể sửa chữa bất cứ một bit lỗi nào, và phát hiện tất cả lỗi của 1 bit, và các lỗi của 2 bit gây ra. Điều này có nghĩa là đối với tất cả các phương tiện truyền thông không có chùm lỗi đột phát (burst errors) xảy ra, mã (7,4) của Hamming rất có hiệu quả (trừ phi phương tiện truyền thông có độ nhiễu rất cao thì nó mới có thể gây cho 2 bit trong số 7 bit truyền bị đảo lộn).

Ví dụ về cách dùng các ma trận thông qua GF(2) [2]

Nguyên lý của mã Hamming bắt nguồn từ việc khai triển và mở rộng quan điểm chẵn lẻ. Việc khai triển này bắt đầu bằng việc nhân các ma trận, được gọi là Ma trận Hamming (Hamming matrices), với nhau. Đối với mã Hamming (7,4), chúng ta sử dụng hai mã trận có liên quan gần gũi, và đặt tên cho chúng là:

H e := ( 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 1 1 1 1 0 1 1 1 1 0 1 ) {\displaystyle H_{e}:={\begin{pmatrix}1&0&0&0\\0&1&0&0\\0&0&1&0\\0&0&0&1\\0&1&1&1\\1&0&1&1\\1&1&0&1\\\end{pmatrix}}}

H d := ( 0 0 0 1 1 1 1 0 1 1 0 0 1 1 1 0 1 0 1 0 1 ) {\displaystyle H_{d}:={\begin{pmatrix}0&0&0&1&1&1&1\\0&1&1&0&0&1&1\\1&0&1&0&1&0&1\\\end{pmatrix}}}

Các cột vectơ trong H e {\displaystyle H_{e}} là nền tảng hạch của H d {\displaystyle H_{d}} và phần trên của H e {\displaystyle H_{e}} (4 hàng đầu) là một ma trận đơn vị (identity matrix). Ma trận đơn vị cho phép vectơ dữ liệu đi qua trong khi làm tính nhân, và như vậy, các bit dữ liệu sẽ nằm ở 4 vị trí trên cùng (sau khi nhân). Sau khi phép nhân hoàn thành, khác với cách giải thích ở phần trước (các bit chẵn lẻ nằm ở vị trí 2k), trật tự của các bit trong từ mã (codewords) ở đây khác với cách bố trí đã nói (các bit dữ liệu nằm ở trên, các bit kiểm chẵn lẻ nằm ở dưới).

Chúng ta dùng một nhóm 4 bit dữ liệu (số 4 trong cái tên của mã là vì vậy) chủ chốt, và cộng thêm vào đó 3 bit dữ liệu thừa (vì 4+3=7 nên mới có số 7 trong cái tên của mã). Để truyền gửi dữ liệu, chúng ta hãy nhóm các bit dữ liệu mà mình muốn gửi thành một vectơ. Lấy ví dụ, nếu dữ liệu là "1011" thì vectơ của nó là:

p = ( 1 0 1 1 ) {\displaystyle \mathbf {p} ={\begin{pmatrix}1\\0\\1\\1\end{pmatrix}}}

Giả sử, chúng ta muốn truyền gửi dữ liệu trên. Chúng ta tìm tích của H e {\displaystyle H_{e}} và p, với các giá trị môđulô 2 [3]:

H e p = ( 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 1 1 1 1 0 1 1 1 1 0 1 ) ( 1 0 1 1 ) = ( 1 0 1 1 0 1 0 ) = r {\displaystyle H_{e}\mathbf {p} ={\begin{pmatrix}1&0&0&0\\0&1&0&0\\0&0&1&0\\0&0&0&1\\0&1&1&1\\1&0&1&1\\1&1&0&1\\\end{pmatrix}}{\begin{pmatrix}1\\0\\1\\1\end{pmatrix}}={\begin{pmatrix}1\\0\\1\\1\\0\\1\\0\end{pmatrix}}=\mathbf {r} }

Máy thu sẽ nhân H d {\displaystyle H_{d}} với r, để kiểm tra xem có lỗi xảy ra hay không. Thi hành tính nhân này, máy thu được (một lần nữa, các giá trị đồng dư môđulô 2):

H d r = ( 0 0 0 1 1 1 1 0 1 1 0 0 1 1 1 0 1 0 1 0 1 ) ( 1 0 1 1 0 1 0 ) = ( 0 0 0 ) {\displaystyle H_{d}\mathbf {r} ={\begin{pmatrix}0&0&0&1&1&1&1\\0&1&1&0&0&1&1\\1&0&1&0&1&0&1\\\end{pmatrix}}{\begin{pmatrix}1\\0\\1\\1\\0\\1\\0\end{pmatrix}}={\begin{pmatrix}0\\0\\0\end{pmatrix}}}

Vì chúng ta được một vectơ toàn số không cho nên máy thu có thể kết luận là không có lỗi xảy ra

Sở dĩ một vectơ toàn số không có nghĩa là không có lỗi, bởi vì khi H e {\displaystyle H_{e}} được nhân với vectơ dữ liệu, một sự thay đổi trong nền tảng xảy ra đối với không gian bên trong vectơ (vector subspace), tức là hạch của H d {\displaystyle H_{d}} . Nếu không có vấn đề gì xảy ra trong khi truyền thông, r sẽ nằm nguyên trong hạch của H d {\displaystyle H_{d}} và phép nhân sẽ cho kết quả một vectơ toàn số không.

Trong một trường hợp khác, nếu chúng ta giả sử là lỗi một bit đã xảy ra. Trong toán học, chúng ta có thể viết:

r + e i {\displaystyle \mathbf {r} +\mathbf {e} _{i}}

môđulô 2, trong đó ei là vectơ đơn vị đứng thứ i (ith unit vector), có nghĩa là, một vectơ số 0 có một giá trị một trong vị trí i (tính từ 1 tính đi). Biểu thức trên nói cho chúng ta biết rằng có một bit bị lỗi tại vị trí i.

Nếu bây giờ chúng ta nhân H d {\displaystyle H_{d}} với cả hai vectơ này:

H d ( r + e i ) = H d r + H d e i {\displaystyle H_{d}(\mathbf {r} +\mathbf {e} _{i})=H_{d}\mathbf {r} +H_{d}\mathbf {e} _{i}}

r là dữ liệu thu nhận được không có lỗi, cho nên tích của H d {\displaystyle H_{d}} và r bằng 0. Do đó

H d r + H d e i = 0 + H d e i = H d e i {\displaystyle H_{d}\mathbf {r} +H_{d}\mathbf {e} _{i}=\mathbf {0} +H_{d}\mathbf {e} _{i}=H_{d}\mathbf {e} _{i}}

Vậy, tích của H d {\displaystyle H_{d}} với vectơ nền chuẩn tại cột thứ i (the ith standard basis vector) làm lộ ra cột ở trong H d {\displaystyle H_{d}} , vì thế mà chúng ta biết rằng lỗi đã xảy ra tại vị trí cột này trong H d {\displaystyle H_{d}} . Vì chúng ta đã kiến tạo H d {\displaystyle H_{d}} dưới một hình thức nhất định, cho nên chúng ta có thể hiểu giá trị của cột này như một số nhị phân - ví dụ, (1,0,1) là một cột trong H d {\displaystyle H_{d}} , tương đồng giá trị với cột thứ 5, do đó chúng ta biết lỗi xảy ra ở đâu và có thể sửa được nó.

Lấy ví dụ, giả sử chúng ta có:

s = r + e 2 = ( 1 1 1 1 0 1 0 ) {\displaystyle \mathbf {s} =\mathbf {r} +\mathbf {e} _{2}={\begin{pmatrix}1\\1\\1\\1\\0\\1\\0\end{pmatrix}}}

Nếu thi hành phép nhân:

H d s = ( 0 0 0 1 1 1 1 0 1 1 0 0 1 1 1 0 1 0 1 0 1 ) ( 1 1 1 1 0 1 0 ) = ( 0 1 0 ) {\displaystyle H_{d}\mathbf {s} ={\begin{pmatrix}0&0&0&1&1&1&1\\0&1&1&0&0&1&1\\1&0&1&0&1&0&1\\\end{pmatrix}}{\begin{pmatrix}1\\1\\1\\1\\0\\1\\0\end{pmatrix}}={\begin{pmatrix}0\\1\\0\end{pmatrix}}}

Tích của phép nhân cho chúng ta một kết quả tương đương với cột thứ 2 ("010" tương đương với giá trị 2 trong số thập phân), và do đó, chúng ta biết rằng lỗi đã xảy ra ở vị trí thứ 2 trong hàng dữ liệu, và vì vậy có thể sửa được lỗi.

Chúng ta có thể dễ dàng thấy rằng, việc sửa lỗi do 1 bit bị đảo lộn gây ra, dùng phương pháp trên là một việc thực hiện được. Bên cạnh đó, mã Hamming còn có thể phát hiện lỗi do 1 bit hoặc 2 bit bị đảo lộn gây ra, dùng tích của H d {\displaystyle H_{d}} khi tích này không cho một vectơ số không. Tuy thế, song mã Hamming không thể hoàn thành cả hai việc.